﻿Imports Commander_Wars.Spieletools
Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
<Serializable()> Public Class ObjektSpielfeld
    Implements ICloneable
#Region "Variablen"
#Region "Konstanten"
    Public Const StartHöhe As Single = 15
    Public Const WarteZeitZwischenAnimationen As Integer = 8
    Public Const Bodenschlacht As Integer = 0
    Public Const Luftschlacht As Integer = 1
    Public Const TopLayer As Integer = 2
#End Region

    Public EingabenErlauben As Boolean = True
    Public BildschirmKooX As Integer
    Public BildschirmKooY As Integer
    Public KameraPos As Vector3
    Private pKameraTarget As Vector3

    Public Property KameraTarget() As Vector3
        Get
            Return pKameraTarget
        End Get
        Set(ByVal value As Vector3)
            pKameraTarget = value
            KameraPosBerechnen()
        End Set
    End Property

    Private pKameraVerhältnisWeite As Single = 5
    Public Property KameraVerhältnisWeite() As Single
        Get
            Return pKameraVerhältnisWeite
        End Get
        Set(ByVal value As Single)
            pKameraVerhältnisWeite = value
            KameraPosBerechnen()
        End Set
    End Property
    Private pKameraHöhe As Single = StartHöhe
    Public Property KameraHöhe() As Single
        Get
            Return pKameraHöhe
        End Get
        Set(ByVal value As Single)
            pKameraHöhe = value
            KameraPosBerechnen()
        End Set
    End Property
    Private pKameraRichtung As Single = 0 'Vector3.Normalize(New Vector3(0, -10, 1))
    Public Property KameraRichtung() As Single
        Get
            Return pKameraRichtung
        End Get
        Set(ByVal value As Single)
            pKameraRichtung = value 'Ich nehm nur normalisierte Vektoren!
            KameraPosBerechnen()
        End Set
    End Property
    ''' <summary>
    ''' Wird automatisch aufgerufen, wenn sich die Kamerahöhe, oder die Kamerarotation ändert.
    ''' </summary>
    ''' <remarks></remarks>
    Sub KameraPosBerechnen()
        If pKameraHöhe < 1 Then pKameraHöhe = 1
        If pKameraHöhe > 640 Then pKameraHöhe = 640
        If pKameraVerhältnisWeite < 0.2 Then pKameraVerhältnisWeite = 0.2
        If pKameraVerhältnisWeite > 7 Then pKameraVerhältnisWeite = 7
        Dim KameraWeite As Single = pKameraHöhe / pKameraVerhältnisWeite
        '        KameraPos = New Vector3(-Math.Sin(pKameraRichtung), +pKameraHöhe, -Math.Cos(pKameraRichtung))
        KameraPos = Vector3.Add(New Vector3((-Math.Sin(pKameraRichtung)) * KameraWeite, pKameraHöhe, -Math.Cos(pKameraRichtung) * KameraWeite), KameraTarget)
    End Sub

    Public Kartenname As String = ""
    Public Beschreibung As String = "Keine Beschreibung vorhanden."
    Public Autor As String = ""
    ''' <summary>
    ''' Ein Wert setzt den Tag um eins nach oben
    ''' </summary>
    ''' <remarks></remarks>
    Private Runden As Integer = 0
    Public Property Runde() As Integer
        Get
            Return Runden
        End Get
        Set(ByVal value As Integer)
            Runden += 1
        End Set
    End Property
    <NonSerialized()> Public AktuelleEinheit As ObjektEinheit
    ''' <summary>
    ''' Das Wegsuchsystem der Aktuellen Einheit
    ''' </summary>
    ''' <remarks></remarks>
    <NonSerialized()> Public Wegsuchsystem As Wegsuchsystem
    <NonSerialized()> Public AktuelleEinheitPosition As Point
    <NonSerialized()> Public Laufen As ObjektLaufen
    <NonSerialized()> Public LaufenLöschen As Boolean = False
    <NonSerialized()> Public AktuelleEinheitPfeil As ObjektPfeil
    <NonSerialized()> Public AktuelleEinheitHatGefeuert As Boolean = False
    <NonSerialized()> Public Animationen() As ObjektAnimation = {}
    <NonSerialized()> Public AngriffsAnzeige As ObjektLabel
    <NonSerialized()> Public KI As ObjektKI
    <NonSerialized()> Public KOInfos As ObjektKOInformation
    Public MapPosition As String = ""
    Private Frames As Integer
    Public Property Frame() As Integer
        Get
            Return Frames
        End Get
        Set(ByVal value As Integer)
            Frames += 1
            If Frames > 3 Then
                Frames = 0
            End If
        End Set
    End Property
    Private Wetterframes As Integer
    Public Property Wetterframe() As Integer
        Get
            Return Wetterframes
        End Get
        Set(ByVal value As Integer)
            Wetterframes += 1
            If Wetterframes > 15 Then
                Wetterframes = 0
            End If
        End Set
    End Property
    Public Landschaften(,,) As ObjektLandschaft
    Public Einheiten(,,) As ObjektEinheit = {}
    Public MomentaneSchlacht As Integer = 0
    Public Breite As Integer
    Public Höhe As Integer
    Public Spieler() As ObjektSpieler = {}
    Public AktuellerSpieler As ObjektSpieler
    Public Regeln As ObjektRegeln
    Public CommanderWarsModus As CommanderWarsGameModi
    <NonSerialized()> Public KOAnzeigen As ObjektKOAnzeigen
    <NonSerialized()> Public InfoAnzeige As ObjektInfoAnzeige
    <NonSerialized()> Public RundenAnfangAnzeige As RundenAnfangBild
    <NonSerialized()> Public Angriff As ObjektAngriff
    Enum Wetterarten
        Sonne
        Regen
        Schnee
        Sandsturm
    End Enum
    <NonSerialized()> Public KIPause As Boolean = False
    '  <NonSerialized()> Public KOTextSprechen As ObjektKODialog
    <NonSerialized()> Public AnimationsBackbuffer As BackbufferSpiel

    Public Scripts() As ObjektScript = {}
    Public NächsteKarte As String
    Public Aufzeichnung As ObjektAufzeichnungen = Nothing
    Public ObjektLandkartenInfo As ObjektLandkartenInfos = Nothing
#End Region
    Public Sub New(ByVal neuBreite As Integer, ByVal neuHöhe As Integer, ByVal neuSpieler() As ObjektSpieler, ByVal neuRegeln As ObjektRegeln)
        Autor = My.Settings.Autor
        If Autor = "" Then
            Autor = "Anonym"
        End If
        KameraHöhe = StartHöhe
        KameraTarget = New Vector3(0, 0, 0)
        KameraPos = New Vector3(0, 70, -1)
        KameraRichtung = 0
        Breite = neuBreite
        Höhe = neuHöhe
        Spieler = neuSpieler
        Regeln = neuRegeln
        AnimationsBackbuffer = New BackbufferSpiel
        ReDim Landschaften(neuBreite - 1, neuHöhe - 1, 1)
        ReDim Einheiten(neuBreite - 1, neuHöhe - 1, 1)
        For X = 0 To Breite - 1
            For Y = 0 To Höhe - 1
                Landschaften(X, Y, 0) = New ObjektLandschaft("EBENE", X, Y, Me)
                Landschaften(X, Y, 1) = New ObjektLandschaft("LUFT", X, Y, Me)
            Next
        Next
        Objektverwalter.ArmeeTexturenLaden(Spieler)
    End Sub
    Public Sub Malen()
        BackbufferSpiel.Frame()
        If My.Settings.draw3D Then

            'Wir malen eine Käseglocke. Moment wo ist der Käse?
            'Eagle rück den Käse raus!
            Dim M As New Material
            M.Diffuse = Color.White
            M.Ambient = Color.White
            M.Emissive = Color.White
            Grafikengine.Grafikkarte.Material = M
            Dim mat As Matrix = Matrix.Translation(Breite / 2, 0, -Höhe / 2)
            TexturenHalter.GetKäseGlocke.Malen(mat)

            For i = 0 To Objektverwalter.LandschaftenBilder.Length - 1
                Objektverwalter.LandschaftenBilder(i).Tick() 'eventuelle Berechnungen durchführen.
            Next
            ObjektmarkiertesFeld.FarbwerteBerechnen()
            Symbol3D.Berechnen() 'Der darf auch noch rumrotieren.
        End If
        'Hier malen wir Landschaften
        DrawSchlacht(Bodenschlacht)
        If My.Settings.draw3D Then
            If KameraPos.Y = 0 Then
                Grafikengine.Grafikkarte.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 4, Hauptmenü.MainMenü.MalPanel.Width / Hauptmenü.MainMenü.MalPanel.Height, 1, 1000)
                KameraHöhe = StartHöhe
                KameraPos = New Vector3(0, 70, -1)
                KameraTarget = New Vector3(0, 0, 0)
                KameraRichtung = 0
            End If
        End If
        'Die Luftschlacht wird jetzt gemalt
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then DrawSchlacht(Luftschlacht)
        For I = 0 To Objektverwalter.MarkierteFelder.Count - 1
            Objektverwalter.MarkierteFelder(I).Malen()
        Next
        Frame = 1
        If IsNothing(Laufen) = False Then
            Laufen.Einheitmalen()
        Else
            If IsNothing(AktuelleEinheit) = False Then
                AktuelleEinheit.Malen(AktuelleEinheitPosition.X, AktuelleEinheitPosition.Y, 255)
                If IsNothing(AktuelleEinheitPfeil) = False Then
                    AktuelleEinheitPfeil.Malen()
                End If
            End If
        End If
        If IsNothing(AngriffsAnzeige) = False Then
            AngriffsAnzeige.Malen()
        End If
        If IsNothing(InfoAnzeige) = False Then
            InfoAnzeige.Malen()
        End If
        If IsNothing(KOAnzeigen) = False Then
            KOAnzeigen.Malen()
        End If
        If Not KOInfos Is Nothing Then
            KOInfos.Malen()
        End If
        If IsNothing(RundenAnfangAnzeige) = False Then
            If RundenAnfangAnzeige.Malen = True Then
                RundenAnfang()
            End If
        End If

        'Die Animationen im Toplayer werden gemalt.
        DrawAnimationen(TopLayer, 255)

        If IsNothing(Angriff) = False Then
            If Angriff.Malen = True Then
                'Der Kampf ist beendet jetzt muss er nur noch ausgewertet werden.
                Angriff.AngriffEnde()
                ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
                    ObjektMaus.Visible = False
                    Objektverwalter.Spielfeld.EingabenErlauben = False
                End If
                Angriff = Nothing
                Regeln.CheckSieg()
            End If
        End If
        If Not ObjektKODialog.AktuellerDialog Is Nothing Then
            If ObjektKODialog.AktuellerDialog.Malen = True Then
                ObjektKODialog.AktuellerDialog.Löschen()
            End If
        End If

        If KIPause = False Then
            If IsNothing(KI) = False Then
                KI.KIFrame()
            End If
        End If
    End Sub
    Private Sub DrawSchlacht(ByVal Schlacht As Integer)
        Dim Alpha As Integer = 255
        If Schlacht = Luftschlacht Then
            If MomentaneSchlacht = Luftschlacht Then
                Alpha *= 0.7#
            Else
                Alpha *= 0.2#
            End If
        End If

        Dim Xmax As Integer = 0
        Dim Ymax As Integer = 0
        Dim Xmin As Integer = 0
        Dim Ymin As Integer = 0
        If My.Settings.draw3D Then
            Xmax = Breite
            Ymax = Höhe
            Xmin = 0
            Ymin = 0
        Else
            Xmax = (-1 * Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenü.MainMenü.MalPanel.Width - (Hauptmenü.MainMenü.MalPanel.Width - Hauptmenü.Rechteck.Width - Hauptmenü.Rechteck.X)) / ((Hauptmenü.Feldbreite)) + 1
            Ymax = (-1 * Objektverwalter.Spielfeld.BildschirmKooY + Hauptmenü.MainMenü.MalPanel.Height - (Hauptmenü.MainMenü.MalPanel.Height - Hauptmenü.Rechteck.Height - Hauptmenü.Rechteck.Y)) / (Hauptmenü.Feldbreite) + 1
            Xmin = (-1 * Objektverwalter.Spielfeld.BildschirmKooX + Hauptmenü.Rechteck.X) / (Hauptmenü.Feldbreite) - 1
            Ymin = (-1 * Objektverwalter.Spielfeld.BildschirmKooY + Hauptmenü.Rechteck.Y) / (Hauptmenü.Feldbreite) - 1
            If Xmin < 0 Then Xmin = 0
            If Ymin < 0 Then Ymin = 0
            If Xmax > Breite Then Xmax = Breite
            If Ymax > Höhe Then Ymax = Höhe
        End If
        'Zuerst werden die Landschaften gemalt
        'Zuerst Malen wir die schlacht.
        If My.Settings.draw3D Then
            Grafikengine.Sprite.End() 'Das Problem ist, dass das Sprite während dem 3D beendet werden muss!
            Objekt3D.SpielerFarbe = Objekt3D.Spielerfarben(0)
        End If

        For X = Xmin To Xmax - 1
            For Y = Ymin To Ymax - 1
                If Landschaften(X, Y, Schlacht).Groß = False Or My.Settings.draw3D Then
                    Grafikengine.szfScale = Nothing
                    Landschaften(X, Y, Schlacht).Malen(X, Y, Alpha)
                End If
            Next
        Next
        If My.Settings.draw3D Then
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        End If
        For X = Xmin To Xmax - 1
            For Y = Ymin To Ymax - 1
                Landschaften(X, Y, Schlacht).ÜbergängeMalen(Alpha, X, Y)
            Next
        Next


        If My.Settings.draw3D Then
            Grafikengine.Sprite.End() 'Das Problem ist, dass das Sprite während dem 3D beendet werden muss!
        End If
        For X = Xmin To Xmax - 1
            For Y = Ymin To Ymax - 1
                If Not My.Settings.draw3D Then
                    If Landschaften(X, Y, Schlacht).Groß = True Then
                        Landschaften(X, Y, Schlacht).Malen(X, Y, Alpha)
                    End If
                End If
                If IsNothing(Landschaften(X, Y, Schlacht).Gebäude) = False Then
                    Landschaften(X, Y, Schlacht).Gebäude.Malen(Landschaften(X, Y, Schlacht).Kriegsnebel, Alpha, X, Y)
                End If

                If Not My.Settings.draw3D Then
                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenü.Feldbreite * X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenü.Feldbreite * Y + Objektverwalter.Spielfeld.BildschirmKooY)
                    Landschaften(X, Y, Schlacht).WetterMalen()
                End If
            Next
        Next

        Dim intcolor As Color = Color.FromArgb(Alpha, 255, 255, 255)
        For Each Player In Spieler
            If Not Player.KOS Is Nothing Then
                Dim KO As ObjektEinheit = Player.KOS(0).GetKOEinheit
                If Not KO Is Nothing Then
                    If KO.Sichtbar Then
                        If OnMap(KO.X, KO.Y) Then
                            If KO.IsGetarnt(Regeln.LetzterMensch) = False Then
                                If KO.GetMap = Schlacht Then
                                    Dim KORange As Integer = Player.KOS(0).GetKORange
                                    Dim Kreis As Integer(,) = Kreisfunktion(KORange)
                                    Dim TexturID As Integer = ObjektmarkiertesFeld.LoadTextur("MarkiertesFeld+Gelb")
                                    For X = 0 To KORange * 2
                                        For Y = 0 To KORange * 2
                                            If Kreis(X, Y) >= 0 Then
                                                If OnMap(X - KORange + KO.X, Y - KORange + KO.Y) Then
                                                    Grafikengine.szfScale = Nothing
                                                    With Grafikengine.recBild
                                                        .X = Hauptmenü.Feldbreite * Objektverwalter.FrameMarkierteFelder : .Width = Hauptmenü.Feldbreite
                                                        .Y = 0 : .Height = Hauptmenü.Feldbreite
                                                    End With
                                                    With Grafikengine.ptfRotCenter
                                                        .X = Hauptmenü.Feldbreite / 2
                                                        .Y = Hauptmenü.Feldbreite / 2
                                                    End With
                                                    Grafikengine.ptfPosition = New Drawing.Point(Hauptmenü.Feldbreite * (X - KORange + KO.X) + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenü.Feldbreite * (Y - KORange + KO.Y) + Objektverwalter.Spielfeld.BildschirmKooY)
                                                    Grafikengine.Sprite.Draw2D(ObjektmarkiertesFeld.Textur.GetTextur(TexturID), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, 0, Grafikengine.ptfPosition, intcolor)
                                                End If
                                            End If
                                        Next
                                    Next
                                End If
                            End If
                        End If
                    End If
                End If
            End If
        Next

        For X = Xmin To Xmax - 1
            For Y = Ymin To Ymax - 1
                If IsNothing(Einheiten(X, Y, Schlacht)) = False Then
                    Einheiten(X, Y, Schlacht).Malen(X, Y, Alpha)
                End If
            Next
        Next
        If My.Settings.draw3D Then
            WetterMalen3D(Regeln.Wetter)
            Grafikengine.Sprite.Begin(SpriteFlags.AlphaBlend)
        End If

        DrawAnimationen(Schlacht, Alpha)

    End Sub
    Public Sub DrawAnimationen(ByVal Schlacht As Integer, Optional ByVal Alpha As Integer = 255)
        'Wir malen die Animationen dieser Schlacht
        Dim Max As Integer = Animationen.Length - 1
        Dim I As Integer = 0
        While I <= Max
            ObjektMaus.Visible = False
            Objektverwalter.Spielfeld.EingabenErlauben = False
            If Animationen(I).Schlacht < 0 Then Animationen(I).Schlacht = 0
            If Animationen(I).Schlacht = Schlacht Then
                If Animationen(I).Malen(Color.FromArgb(Alpha, 255, 255, 255)) = False Then
                    Animationen(I).RemoveHandles()
                    Animationen(I) = Nothing
                    Animationen(I) = Animationen(Animationen.Length - 1)
                    Array.Resize(Animationen, Animationen.Length - 1)
                    If Animationen.Length = 0 Then
                        If Not Objektverwalter.Spielfeld.AktuellerSpieler Is Nothing Then
                            If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                                ObjektMaus.Visible = True
                                Objektverwalter.Spielfeld.EingabenErlauben = True
                            End If
                        Else
                            ObjektMaus.Visible = True
                            Objektverwalter.Spielfeld.EingabenErlauben = True
                        End If
                    Else
                        ObjektMaus.Visible = False
                        Objektverwalter.Spielfeld.EingabenErlauben = False
                    End If
                    Max -= 1
                Else
                    I += 1
                End If
            Else
                I += 1
            End If
        End While
    End Sub
    Public Sub Sichterstellen()
        Dim RegenNebel As Boolean = False
        Select Case My.Settings.CommanderWarsGameMoodus
            Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.AdvanceWarsDS, CommanderWarsGameModi.CommanderWars2
                'In DS und DC müssen wir jetzt Nebel erzeugen.
                'Ich will aber nicht.
                'Hier geht es nicht um wollen sondern um die Regeln. Doof!
                If Regeln.Wetter = Wetterarten.Regen Then
                    If Not Spieler(Regeln.LetzterMensch).KOS(0).Wetterimmunität.Contains(Wetterarten.Regen) Then
                        RegenNebel = True
                    End If
                End If
        End Select
        For X = 0 To Breite - 1
            For Y = 0 To Höhe - 1
                If Regeln.Nebel > 0 Or RegenNebel Then
                    If RegenNebel Then
                        Landschaften(X, Y, MomentaneSchlacht).Kriegsnebel = Nebelarten.Kriegsnebel
                    Else
                        Landschaften(X, Y, MomentaneSchlacht).Kriegsnebel = Regeln.Nebel
                    End If
                    If IsNothing(Einheiten(X, Y, MomentaneSchlacht)) = False Then
                        Einheiten(X, Y, MomentaneSchlacht).Sichtbar = False
                    End If
                Else
                    Landschaften(X, Y, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                    If IsNothing(Einheiten(X, Y, MomentaneSchlacht)) = False Then
                        If Einheiten(X, Y, MomentaneSchlacht).GetSpieler.Team = Spieler(Regeln.LetzterMensch).Team Then
                            Einheiten(X, Y, MomentaneSchlacht).Sichtbar = True
                        Else
                            If Einheiten(X, Y, MomentaneSchlacht).Feldtarnung Then
                                Einheiten(X, Y, MomentaneSchlacht).Sichtbar = False
                            ElseIf Einheiten(X, Y, MomentaneSchlacht).GetTarnung Then
                                Einheiten(X, Y, MomentaneSchlacht).Sichtbar = False
                            Else
                                Einheiten(X, Y, MomentaneSchlacht).Sichtbar = True
                            End If
                        End If
                    End If
                End If
            Next
        Next

        If Regeln.Nebel > 0 Or RegenNebel Then
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    'Feuer erstellen ein Sichtfeld
                    If Landschaften(X, Y, MomentaneSchlacht).LandschaftsID = "FEUER" Then
                        CreateFeuerSicht(X, Y, LandschaftsTexturFeuer.FeuerSicht)
                    End If
                    If IsNothing(Landschaften(X, Y, MomentaneSchlacht).Gebäude) = False Then
                        If Spieler(Landschaften(X, Y, MomentaneSchlacht).Gebäude.Spieler).Team = Spieler(Regeln.LetzterMensch).Team Then
                            Dim G As ObjektGebäude = Landschaften(X, Y, MomentaneSchlacht).Gebäude
                            Landschaften(X, Y, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                            If IsNothing(Einheiten(X, Y, MomentaneSchlacht)) = False Then
                                Einheiten(X, Y, MomentaneSchlacht).Sichtbar = True
                            End If
                            If G.Angriff = ObjektGebäude.Angriffe.Radar Then
                                Dim Kreis(,) As Integer = Kreisfunktion(G.Reichweite)
                                For X1 = 0 To Kreis.GetLength(0) - 1
                                    For Y1 = 0 To Kreis.GetLength(1) - 1
                                        If OnMap(X - G.Reichweite + X1, Y - G.Reichweite + Y1) Then
                                            If Kreis(X1, Y1) > 0 Then
                                                If Landschaften(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Tarnung = False Then
                                                    Landschaften(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                    If IsNothing(Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht)) = False Then
                                                        If Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).IsGetarnt(Regeln.LetzterMensch) = False Then
                                                            Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                                                        End If
                                                    End If
                                                Else
                                                    If IsNothing(Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht)) = False Then
                                                        If Objektverwalter.Spielfeld.Spieler(G.Spieler).KOS(0).RiffWaldSchauer = True Then
                                                            Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                                                            Landschaften(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                        Else
                                                            If Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Bewegungsart = MovementSorts.Helikopter.ToString Or Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Bewegungsart = MovementSorts.Flugzeug.ToString Then
                                                                If Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).IsGetarnt(Regeln.LetzterMensch) = False Then
                                                                    Einheiten(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                                                                    Landschaften(X - G.Reichweite + X1, Y - G.Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                                End If
                                                            End If
                                                        End If
                                                    End If
                                                End If
                                            End If
                                        End If
                                    Next
                                Next
                            End If
                        End If
                    End If
                    If IsNothing(Einheiten(X, Y, MomentaneSchlacht)) = False Then
                        If Spieler(Einheiten(X, Y, MomentaneSchlacht).Spieler).Team = Spieler(Regeln.LetzterMensch).Team Then
                            Dim Sicht As Integer = Einheiten(X, Y, MomentaneSchlacht).GetSicht(X, Y)
                            If Spieler(Einheiten(X, Y, MomentaneSchlacht).Spieler).VeränderteWerte.SichtradiusVeränderung > 0 Then
                                Sicht = Spieler(Einheiten(X, Y, MomentaneSchlacht).Spieler).VeränderteWerte.SichtradiusVeränderung
                            End If
                            Dim Kreis(,) As Integer = Kreisfunktion(Sicht)
                            For X1 = 0 To Kreis.GetLength(0) - 1
                                For Y1 = 0 To Kreis.GetLength(1) - 1
                                    If X - Sicht + X1 >= 0 And X - Sicht + X1 < Breite And Y - Sicht + Y1 >= 0 And Y - Sicht + Y1 < Höhe Then
                                        If Kreis(X1, Y1) >= 0 Then
                                            If Kreis(X1, Y1) <= 1 Then
                                                Landschaften(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                If IsNothing(Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht)) = False Then
                                                    Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Sichtbar = True
                                                End If
                                            Else
                                                If Landschaften(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Tarnung = False Then
                                                    Landschaften(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                    If IsNothing(Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht)) = False Then
                                                        If Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).IsGetarnt(Regeln.LetzterMensch) = False Then
                                                            Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Sichtbar = True
                                                        End If
                                                    End If
                                                Else
                                                    If IsNothing(Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht)) = False Then
                                                        If Objektverwalter.Spielfeld.Spieler(Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Spieler).KOS(0).RiffWaldSchauer = True Then
                                                            Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Sichtbar = True
                                                            Landschaften(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                        Else
                                                            If Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).IsFlyingUnit Then
                                                                If Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).IsGetarnt(Regeln.LetzterMensch) = False Then
                                                                    Einheiten(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Sichtbar = True
                                                                    Landschaften(X - Sicht + X1, Y - Sicht + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                                                End If
                                                            End If
                                                        End If
                                                    End If
                                                End If
                                            End If
                                        End If
                                    End If
                                Next
                            Next
                        End If
                    End If
                Next
            Next
            If AktuellerSpieler.Team = Spieler(Regeln.LetzterMensch).Team Then
                For I = 0 To AktuellerSpieler.Sichtfelder.Length - 1
                    If AktuellerSpieler.Sichtfelder(I).Z = MomentaneSchlacht Then
                        UnfogArea(AktuellerSpieler.Sichtfelder(I).X, AktuellerSpieler.Sichtfelder(I).Y, AktuellerSpieler.Sichtfelder(I).W, AktuellerSpieler.Spieler, True)
                    End If
                Next
            End If
        ElseIf IsNothing(AktuellerSpieler) = False Then
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    If IsNothing(Einheiten(X, Y, MomentaneSchlacht)) = False Then
                        If Not Spieler(Regeln.LetzterMensch).Team = Spieler(Einheiten(X, Y, MomentaneSchlacht).Spieler).Team Then
                            If Einheiten(X, Y, MomentaneSchlacht).Sichtbar = False Then
                                Dim G As ObjektGebäude = Landschaften(X, Y, MomentaneSchlacht).Gebäude
                                If G IsNot Nothing Then
                                    If G.GetSpieler.Team = Spieler(Regeln.LetzterMensch).Team Then
                                        Einheiten(X, Y, MomentaneSchlacht).Sichtbar = True
                                        Continue For
                                    End If
                                End If
                                Dim X1 As Integer = X
                                Dim Y1 As Integer = Y
                                For I = 0 To 3
                                    Select Case I
                                        Case 0
                                            Y1 -= 1
                                        Case 1
                                            Y1 += 1
                                            X1 += 1
                                        Case 2
                                            X1 -= 1
                                            Y1 += 1
                                        Case 3
                                            Y1 -= 1
                                            X1 -= 1
                                    End Select
                                    If X1 >= 0 And Y1 >= 0 And X1 < Breite And Y1 < Höhe Then
                                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                                            If Spieler(Einheiten(X1, Y1, MomentaneSchlacht).Spieler).Team = Spieler(Regeln.LetzterMensch).Team Then
                                                Einheiten(X, Y, MomentaneSchlacht).Sichtbar = True
                                                Continue For
                                            End If
                                        End If
                                    End If
                                Next
                            End If
                        End If
                    End If
                Next
            Next
        End If
        If IsNothing(AktuellerSpieler) = False Then
            If Not AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                If IsNothing(KI) = False Then
                    KI.CreateSicht()
                End If
            End If
        End If
    End Sub
    ''' <summary>
    ''' Erstellt die Sicht der Landschaft Feuer
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <param name="Sichtweite"></param>
    ''' <remarks></remarks>
    Protected Sub CreateFeuerSicht(ByVal X As Integer, ByVal Y As Integer, ByVal Sichtweite As Integer)
        Dim Kreis(,) As Integer = Kreisfunktion(Sichtweite)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If Kreis(X1, Y1) >= 0 Then
                    If Objektverwalter.Spielfeld.OnMap(X - Sichtweite + X1, Y - Sichtweite + Y1) Then
                        If Objektverwalter.Spielfeld.Landschaften(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht).Tarnung = False Then
                            If IsNothing(Objektverwalter.Spielfeld.Einheiten(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Einheiten(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht).IsGetarnt(AktuellerSpieler.Spieler) = False Then
                                    Landschaften(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                    If IsNothing(Einheiten(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht)) = False Then
                                        Einheiten(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht).Sichtbar = True
                                    End If
                                End If
                            Else
                                Landschaften(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                If IsNothing(Einheiten(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht)) = False Then
                                    Einheiten(X - Sichtweite + X1, Y - Sichtweite + Y1, MomentaneSchlacht).Sichtbar = True
                                End If
                            End If
                        End If
                    End If
                End If
            Next
        Next
    End Sub
    Private Sub UnfogArea(ByVal X As Integer, ByVal Y As Integer, ByVal Reichweite As Integer, ByVal Spieler As Integer, ByVal Alles As Boolean)
        Dim Kreis(,) As Integer = Kreisfunktion(Reichweite)
        For X1 = 0 To Kreis.GetLength(0) - 1
            For Y1 = 0 To Kreis.GetLength(1) - 1
                If OnMap(X - Reichweite + X1, Y - Reichweite + Y1) Then
                    If Kreis(X1, Y1) > 0 Then
                        If Landschaften(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Tarnung = False Or Alles = True Then
                            Landschaften(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                            If IsNothing(Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht)) = False Then
                                If Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).IsGetarnt(Regeln.LetzterMensch) = False Then
                                    Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                                End If
                            End If
                        Else
                            If IsNothing(Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht)) = False Then
                                If Objektverwalter.Spielfeld.Spieler(Spieler).KOS(0).RiffWaldSchauer = True Then
                                    Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                                    Landschaften(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                Else
                                    If Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Bewegungsart = MovementSorts.Helikopter.ToString Or Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Bewegungsart = MovementSorts.Flugzeug.ToString Then
                                        If Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).IsGetarnt(Regeln.LetzterMensch) = False Then
                                            Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                                            Landschaften(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                                        End If
                                    End If
                                End If
                            End If
                        End If
                    ElseIf Kreis(X1, Y1) = 0 Then
                        Landschaften(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Kriegsnebel = Nebelarten.Aus
                        If IsNothing(Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht)) = False Then
                            Einheiten(X - Reichweite + X1, Y - Reichweite + Y1, MomentaneSchlacht).Sichtbar = True
                        End If
                    End If
                End If
            Next
        Next
    End Sub
    Public Function GetGegner(ByVal Spielerarmee As ObjektSpieler) As Integer()
        Dim Feinde() As Integer = {}
        For I = 1 To Spieler.Length - 1
            If Regeln.Besiegt(I) = False Then
                If Not Spieler(I).Team = Spielerarmee.Team Then
                    Array.Resize(Feinde, Feinde.Length + 1)
                    Feinde(Feinde.Length - 1) = I
                End If
            End If
        Next
        Return Feinde
    End Function
    Public Function CountGegner(ByVal Spielerarmee As ObjektSpieler) As Integer
        Dim Feinde As Integer = 0
        For I = 1 To Spieler.Length - 1
            If Regeln.Besiegt(I) = False Then
                If Not Spieler(I).Team = Spielerarmee.Team Then
                    Feinde += 1
                End If
            End If
        Next
        Return Feinde
    End Function
#Region "Runden Ende"
    ''' <summary>
    ''' Wird aufgerufen, nachdem ein Spiel geladen wird.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub SpielWiederaufnehmen()
        For Each E In Einheiten
            If E IsNot Nothing Then
                If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                    Spieler(E.Spieler).KOS(0).SetKOEinheit(E)
                End If
            End If
        Next

        Grafikengine.Grafikkarte.Transform.Projection = Matrix.PerspectiveFovLH(Math.PI / 4, Hauptmenü.MainMenü.MalPanel.Width / Hauptmenü.MainMenü.MalPanel.Height, 1, 1000)
        KameraHöhe = StartHöhe
        KameraTarget = New Vector3(0, 0, 0)
        KameraPos = New Vector3(0, 70, -1)
        KameraRichtung = 0

        Anfangs3DIni()
        If AktuellerSpieler IsNot Nothing Then
            If Regeln.BauBlockade Then
                AktuellerSpieler.SpielerBaublockade = AktuellerSpieler.KOS(0).GetBaublockade(AktuellerSpieler.Spieler)
            End If
            'Wenn die KI drann ist, sollte sie erschaffen werden/ bzw. ziehen lassen.
            If AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Mensch Then
                Objektverwalter.Spielfeld.KI = ObjektLadeklasse.NewKI(AktuellerSpieler)
            End If
        End If

        If My.Settings.Aufzeichnen Then
            'Wir sollen also eine Aufzeichnung machen.
            Hauptmenü.AufzeichnungStart(MapPosition, False)
        End If

        SetAutoResizeMapPosition()
    End Sub
    Public Sub SpielStart()
        CommanderWarsModus = My.Settings.CommanderWarsGameMoodus
        'Aktueller Spieler festlegen!
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
            For I = AktuellerSpieler.Spieler + 1 To Spieler.Length - 1
                If Spieler(I).KIStufe <> ObjektSpieler.KIStufen.Geschlossen Then
                    AktuellerSpieler = Spieler(I)
                    Exit For
                ElseIf I = Spieler.Length - 1 Then
                    For I2 = 0 To AktuellerSpieler.Spieler - 1
                        If Spieler(I2).KIStufe <> ObjektSpieler.KIStufen.Geschlossen Then
                            AktuellerSpieler = Spieler(I2)
                            Exit For
                        End If
                    Next
                End If
            Next
        End If

        If My.Settings.Aufzeichnen Then
            If Not Hauptmenü.AufzeichnungAbspielen Then
                'Wir sollen also eine Aufzeichnung machen.
                Hauptmenü.AufzeichnungStart(MapPosition, True)
            End If
        End If

        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    Dim E As ObjektEinheit = Einheiten(X, Y, I)
                    If IsNothing(E) = False Then
                        If E.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
                            E = Nothing
                        Else
                            If E.Spieler = AktuellerSpieler.Spieler Then
                                E.HatsichBewegt = False
                            End If
                            If E.Munition > E.MunitionMax Then
                                E.Munition = E.MunitionMax
                            End If
                            'Kleines Update je nach Spiel-Version
                            If E.GetCWMunition > E.MunitionMax And E.MunitionMax > 0 Then
                                E.Munition = E.MunitionMax
                            End If
                            'KO Einheiten setzen!
                            If E.EinheitenStufe = ObjektEinheit.Stufe.KO Then
                                Select Case CommanderWarsModus
                                    Case CommanderWarsGameModi.AdvanceWarsDC, CommanderWarsGameModi.CommanderWars2
                                        Spieler(E.Spieler).KOS(0).SetKOEinheit(E)
                                    Case Else
                                        E.EinheitenStufe = ObjektEinheit.Stufe.Veteran
                                End Select
                            End If

                            If E.Treibstoff > E.SpritMax Then
                                E.Treibstoff = E.SpritMax
                            End If
                            E.BildIDbestimmen()
                        End If
                    End If
                    Dim G As ObjektGebäude = Landschaften(X, Y, I).Gebäude
                    If IsNothing(G) = False Then
                        If G.GetSpieler.KIStufe = ObjektSpieler.KIStufen.Geschlossen Then
                            G.Spieler = 0
                        End If
                        G.getBildID(Me)
                        If G.getFonds = True Then
                            Objektverwalter.Spielfeld.Spieler(G.Spieler).Geldgebäude += 1
                        End If
                        Select Case Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude.Angriff
                            Case ObjektGebäude.Angriffe.Sendeturm
                                Objektverwalter.Spielfeld.Spieler(G.Spieler).Sendetürme += 1
                            Case ObjektGebäude.Angriffe.Mine
                                Objektverwalter.Spielfeld.Spieler(G.Spieler).Minen += 1
                        End Select
                    End If
                Next
            Next
        Next
        Regeln.MenschenZählen()
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        ElseIf Regeln.LetzterMensch <= 0 Then
            For I = AktuellerSpieler.Spieler - 1 To 1 Step -1
                If Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Regeln.LetzterMensch = I
                    Exit For
                End If
            Next
            If Regeln.LetzterMensch <= 0 Then
                For I = Spieler.Length - 1 To AktuellerSpieler.Spieler + 1 Step -1
                    If Spieler(I).KIStufe = ObjektSpieler.KIStufen.Mensch Then
                        Regeln.LetzterMensch = I
                        Exit For
                    End If
                Next
            End If
            If Regeln.LetzterMensch <= 0 Then
                Regeln.LetzterMensch = 0
            End If
        End If

        MomentaneSchlacht = Bodenschlacht
        Regeln.SindBesiegbar()
        KOAnzeigen = New ObjektKOAnzeigen()
        InfoAnzeige = New ObjektInfoAnzeige()
        Aufzeichnung = New ObjektAufzeichnungen(AktuellerSpieler.Spieler)
        ObjektScript.Scripts = Scripts

        If Hauptmenü.NetzConnected Then
            'Wir starten das Spiel besser erst, wenn auch alle anderen Spieler soweit sind.
            Hauptmenü.NetzBefehlSenden(Hauptmenü.NetzVorbereitungen.Bereit) 'Also wir sind bereit.
            Dim Fortfahren As Boolean = False
            Do Until Fortfahren
                Fortfahren = True
                For Each nT In Hauptmenü.NetzTeilnehmer
                    If nT.Bereit = False Then
                        Fortfahren = False
                        Exit For
                    End If
                Next
                Threading.Thread.Sleep(100) 'Solange, bis die anderen Spieler soweit sind, können wir uns auf's Ohr hauen :)
            Loop
        End If
        Anfangs3DIni()

        RundenAnfangStart()
        SetAutoResizeMapPosition()
    End Sub
    ''' <summary>
    ''' Die Runde ist Beendet.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RundenEnde()
        'Wir erneuern alle Werte
        Objektverwalter.Spielfeld.EingabenErlauben = False
        'Die KI ist Fertig
        If KI.KIThreat IsNot Nothing Then
            KI.KIThreat.Abort()
        End If
        KI = Nothing

        'Wolken bewegen sich irgendwo hin
        WolkenBewegen()
        'Wenn eine Runde zu Ende geht, sollten die Scripts geprüft werden.
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenEnde)


        If MomentaneSchlacht = Luftschlacht Then
            'Damit wir immer auf der Bodenschlacht starten.
            SchlachtWechseln(False)
        End If

        'Kommt ab und zu bei der KI vor kleiner Bug keine Ahnnung warum
        If IsNothing(AktuelleEinheit) = False Then
            Objektverwalter.Einheitabwählen(True)
        End If
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    If IsNothing(Einheiten(X, Y, I)) = False Then
                        If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                            If Einheiten(X, Y, I).HatsichBewegt = False And AktuellerSpieler.KOS(0).FeldtarnungsReichweite >= 0 Then
                                If AktuellerSpieler.KOS(0).IsInKOZone(X, Y) Then
                                    Einheiten(X, Y, I).SetFeldtarnung(True)
                                End If
                            End If
                            'Die Werte werden zurückgesetzt
                            Einheiten(X, Y, I).HatsichBewegt = False
                            If AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                                'Den Treibstoff übermitteln!
                                Hauptmenü.NetzBefehlSenden(X, Y, I, Einheiten(X, Y, I).Treibstoff)
                            End If
                        End If
                    End If
                    If IsNothing(Landschaften(X, Y, I).Gebäude) = False Then
                        If Landschaften(X, Y, I).Gebäude.Spieler = AktuellerSpieler.Spieler Then
                            'Manche KOS senken die Beszahl für eine Runde. Die wird jetzt wieder normalisiert
                            If Landschaften(X, Y, I).Gebäude.Besetzung > 0 Then
                                If Einheiten(X, Y, I) Is Nothing Then
                                    Landschaften(X, Y, I).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                                Else
                                    If Einheiten(X, Y, I).Besetzen = False Then
                                        Landschaften(X, Y, I).Gebäude.Besetzung = ObjektGebäude.Besetzungszahl
                                    End If
                                End If
                            End If
                            If Landschaften(X, Y, I).Gebäude.GebäudeID = "STADT" Then
                                Dim G As GebäudeStadt = Objektverwalter.Spielfeld.Landschaften(X, Y, I).Gebäude
                                G.KannBauen = False
                            End If
                        End If
                    End If
                Next
            Next
        Next
        'Hat der Spieler Doppel-Gabe eingesetzt und noch nicht gewechselt?
        If IsNothing(AktuellerSpieler.KOS(1)) = False Then
            If AktuellerSpieler.KOS(1).Gabemodus = ObjektKO.Gabemodi.Doppelgabe And AktuellerSpieler.KOS(0).Gabemodus = ObjektKO.Gabemodi.Keine Then
                AktuellerSpieler.KOS(0).Doppelgabe()
                KOAnzeigen.KOAnzeigeerstellen()
                If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                    Objektverwalter.Spielfeld.EingabenErlauben = True
                    Exit Sub
                Else
                    'Ha die KI ist noch mal dran
                    KI = ObjektLadeklasse.NewKI(AktuellerSpieler)
                    Exit Sub
                End If
            End If
        End If
        'jetzt werden die Werte resetet
        AktuellerSpieler.SpielerFrameRundenEnde()
        Aufzeichnung.UpdateAufzeichnungen(False)
        Dim Pause As Boolean = False
        Dim NächsterSpieler As Integer = AktuellerSpieler.Spieler
        While Pause = False
            NächsterSpieler += 1
            If NächsterSpieler > Spieler.Length - 1 Then
                'Ein Tag ist vergangen
                MomentaneSchlacht = 0
                Runde = 1
                NächsterSpieler = 1
            End If
            If Regeln.Besiegt(NächsterSpieler) = False Then
                AktuellerSpieler = Spieler(NächsterSpieler)
                Pause = True
                RundenAnfangStart()
            Else
                Pause = False
            End If
        End While
    End Sub
    ''' <summary>
    ''' Die Runde fängt an, der Splash screen wird gezeigt.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RundenAnfangStart()
        If Objektverwalter.EinheitenMenü IsNot Nothing Then
            Hauptmenü.CursorPlazieren(Objektverwalter.EinheitenMenü.Feldpunkt.X * Hauptmenü.Feldbreite, Objektverwalter.EinheitenMenü.Feldpunkt.Y * Hauptmenü.Feldbreite)
            Objektverwalter.EinheitenMenü = Nothing
        End If
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Objektverwalter.Spielfeld.EingabenErlauben = True
        End If
        For Each Kommandeur In AktuellerSpieler.KOS
            If IsNothing(Kommandeur) = False Then
                Kommandeur.Gabezurücksetzen()
            End If
        Next
        MusikEngine.MusikStop()
        RundenAnfangAnzeige = New RundenAnfangBild()

        Grafikengine.Lichtändern(AktuellerSpieler.KOS(0).getLichtfarbe)
    End Sub
    ''' <summary>
    ''' Die wirkliche Runde fängt an der Splash screen ist weg.
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub RundenAnfang()
        RundenAnfangAnzeige = Nothing
        ObjektMaus.Visible = False

        ' ObjektScript.NeuScript("TestScript")
        'Die Scripts müssen geprüft werden.
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenAnfang)


        AktuellerSpieler.KOS(0).PlayGabeFüllMusik()
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        ElseIf Regeln.LetzterMensch <= 0 Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        ElseIf Spieler(Regeln.LetzterMensch).KIStufe <> ObjektSpieler.KIStufen.Mensch Then
            Regeln.LetzterMensch = AktuellerSpieler.Spieler
        End If
        KOAnzeigen.KOAnzeigeerstellen()
        'Der Spieler bekommt sein Geld
        AktuellerSpieler.EarnMoney()

        AktuellerSpieler.SpielerFrameRundenAnfang()
        'Der Spieler kann alle blockierte Felder wieder betreten
        'Einheiten werden repariert, Treibstoff verbraucht, Einheiten versenkt, und 
        Dim WarteZeit As Integer = 4
        Dim AnzahlSchlachten As Integer = 0
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then AnzahlSchlachten = 1
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    If IsNothing(Einheiten(X, Y, I)) = False Then
                        If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                            Einheiten(X, Y, I).ResetWerte()
                            'In CoW 2 bekommen Rang-Einheiten einen Radius Kreis angezeigt!
                            Einheiten(X, Y, I).X = X
                            Einheiten(X, Y, I).Y = Y
                            Dim Treibstoffverbauch As Integer = Einheiten(X, Y, I).Treibstoffverbrauch - Einheiten(X, Y, I).TreibstoffSenkung
                            If Einheiten(X, Y, I).Bewegungsart = "See" Or Einheiten(X, Y, I).Bewegungsart = MovementSorts.Transport.ToString Then
                                If Spieler(Einheiten(X, Y, I).Spieler).KOS(0).IsInKOZone(Einheiten(X, Y, I)) Then
                                    Treibstoffverbauch -= Spieler(Einheiten(X, Y, I).Spieler).KOS(0).SpritsenkungSee
                                End If
                            ElseIf Einheiten(X, Y, I).Bewegungsart = MovementSorts.Flugzeug.ToString Or Einheiten(X, Y, I).Bewegungsart = MovementSorts.Helikopter.ToString Then
                                If Spieler(Einheiten(X, Y, I).Spieler).KOS(0).IsInKOZone(Einheiten(X, Y, I)) Then
                                    Treibstoffverbauch -= Spieler(Einheiten(X, Y, I).Spieler).KOS(0).SpritsenkungLuft
                                End If
                            End If
                            If Treibstoffverbauch < 0 Then
                                Treibstoffverbauch = 0
                            End If
                            Einheiten(X, Y, I).Sprit -= Treibstoffverbauch

                            If Einheiten(X, Y, I).IsGetaucht = True Then
                                Einheiten(X, Y, I).Sprit -= 4
                            End If

                            'Einheiten in Transportern bekommen immer Ration
                            If Einheiten(X, Y, I).Ladung.Length > 0 Then
                                For Each Einheit In Einheiten(X, Y, I).Ladung
                                    If Not Einheit Is Nothing Then
                                        Einheit.Treibstoff = Einheit.SpritMax
                                        Einheit.Munition = Einheit.MunitionMax
                                        Select Case My.Settings.CommanderWarsGameMoodus
                                            Case CommanderWarsGameModi.CommanderWars2
                                                Einheit.HatsichBewegt = False
                                            Case CommanderWarsGameModi.CommanderWars
                                                Einheit.HatsichBewegt = False
                                            Case Else
                                                Einheit.HatsichBewegt = True
                                        End Select
                                    End If
                                Next
                            End If
                        End If
                        'Falls der KO Rationen verteilen kann tut er das jetzt.
                        If AktuellerSpieler.VeränderteWerte.KeineVersorgung.X = 0 Then
                            If IsNothing(Landschaften(X, Y, I).Gebäude) = False And Einheiten(X, Y, I).KannReapariertWerden = True Then
                                'Dort steht ein Gebäude
                                If AktuellerSpieler.IsReperaturGebäude(Landschaften(X, Y, I).Gebäude.GetSpieler) = True Then
                                    'Das Gebäude gehört dem Spieler
                                    If Landschaften(X, Y, I).Gebäude.Versorung = True Then
                                        'Nun bekommt die Einheit evtl. Ration
                                        Dim Bauliste() As String = {}
                                        If Landschaften(X, Y, 0).Gebäude.GetBauliste.Length > 0 Then
                                            Bauliste = Landschaften(X, Y, I).Gebäude.GetBauliste
                                        Else
                                            Bauliste = ObjektLadeklasse.GetBauliste("Basis")
                                        End If
                                        If FindElement(Bauliste, Einheiten(X, Y, I).EinheitenID) >= 0 Then
                                            If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                                Dim Heilung As Integer = 1
                                                If AktuellerSpieler.KOS(0).IsInKOZone(X, Y) Then
                                                    Heilung = AktuellerSpieler.KOS(0).GebäudeHeilung - 1
                                                End If
                                                For I2 = 0 To Heilung
                                                    Objektverwalter.Heilen(Einheiten(X, Y, I))
                                                Next
                                                Objektverwalter.Ration(X, Y, True, WarteZeit, I)
                                                Objektverwalter.ZuFeldgehen(X, Y)
                                            End If
                                        End If
                                    End If
                                End If
                            End If
                            If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X, Y, I).Fähigkeit = "Ration" Then
                                    AktuelleEinheit = Einheiten(X, Y, I)
                                    AktuelleEinheitPosition = New Point(X, Y)
                                    Objektverwalter.Ration(True, WarteZeit, I)
                                    AktuelleEinheit = Nothing
                                    AktuelleEinheitPosition = New Point(0, 0)
                                    Objektverwalter.ZuFeldgehen(X, Y)
                                End If
                            End If
                        End If

                    End If
                    'Jetzt kommen Gebäude dran auf denen keine Einheit steht
                    If IsNothing(Landschaften(X, Y, I).Gebäude) = False Then
                        'Dort steht ein Gebäude
                        If Landschaften(X, Y, I).Gebäude.Spieler = AktuellerSpieler.Spieler Then
                            'Das Gebäude gehört dem Spieler
                            'Das Gebäude darf einen Frame machen und seine Werte aktualisieren.
                            Landschaften(X, Y, I).Gebäude.DOSpielFrame()
                        ElseIf AktuellerSpieler.Spieler = 1 Then
                            If Landschaften(X, Y, I).Gebäude.Spieler = 0 Then
                                'Das ist ein neutrales Gebäude
                                If Landschaften(X, Y, I).Gebäude.Angriff = ObjektGebäude.Angriffe.Vulkan Then
                                    'Es ist ein Vulkan Feuerfrei im warsten Sinne des Satzes
                                    Landschaften(X, Y, I).Gebäude.Feuer(0, 0)
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        Next
        For I = 0 To AnzahlSchlachten
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    If IsNothing(Einheiten(X, Y, I)) = False Then
                        If Einheiten(X, Y, I).Spieler = AktuellerSpieler.Spieler Then
                            'Wenn die Einheit jetzt weniger als Null Treibstoff hat Boom
                            If Einheiten(X, Y, I).Treibstoff < 0 Then
                                If Einheiten(X, Y, I).SpritMax > 0 Then
                                    Objektverwalter.NeuObjektAnimation(X, Y)
                                End If
                            End If
                            If My.Settings.CommanderWarsGameMoodus = CommanderWarsGameModi.CommanderWars2 Then
                                Einheiten(X, Y, I).EinheitenEffekt()
                            End If
                        End If
                    End If
                Next
            Next
        Next

        If Regeln.BauBlockade Then
            AktuellerSpieler.SpielerBaublockade = AktuellerSpieler.KOS(0).GetBaublockade(AktuellerSpieler.Spieler)
        End If

        Regeln.WetterÄndern()

        Sichterstellen()

        Aufzeichnung.UpdateAufzeichnungen(True)

        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        If Not M.Spielmodus = ObjektSpielMenü.Spielmodi.KOSprechen Then
            M.Spielmodus = ObjektSpielMenü.Spielmodi.Nichts
        End If
        If AktuellerSpieler.KIStufe = ObjektSpieler.KIStufen.Mensch Then
            ObjektMaus.Visible = True
            Objektverwalter.Spielfeld.EingabenErlauben = True
        Else
            KI = ObjektLadeklasse.NewKI(AktuellerSpieler)
        End If
    End Sub
    Public Sub WolkenBewegen()
        If Hauptmenü.NetzHosten = False And Hauptmenü.NetzConnected Then Exit Sub
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            'wir machen das hier nur wenn es eine Luftschlacht gibt
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    If Landschaften(X, Y, Luftschlacht).getID = "WOLKEN" Then
                        If Landschaften(X, Y, Luftschlacht).GetSpielerWolken = AktuellerSpieler.Spieler Then
                            If Zufallszahl(0, 2) = 0 Then 'Mal schauen wie oft wir das tatsächlich machen.
                                Dim Zahl As Integer = Zufallszahl(0, 4)
                                Dim Richtung As Integer = Landschaften(X, Y, Luftschlacht).Bewegungsrichtung
                                If Zahl <= 1 Then
                                    'wir bewegen uns in eine zufällige Richtung 40%
                                    Richtung = Zufallszahl(0, 4)
                                Else
                                    'wir bewegen uns in die richtung weiter 60%
                                End If
                                Dim neuX, neuY As Integer
                                Select Case Richtung
                                    Case 1 'Norden
                                        neuX = X
                                        neuY = Y - 1
                                    Case 2 'Osten
                                        neuX = X + 1
                                        neuY = Y
                                    Case 3 'Süden
                                        neuX = X
                                        neuY = Y + 1
                                    Case 4 'Westen
                                        neuX = X - 1
                                        neuY = Y
                                    Case Else 'Stehen Bleiben
                                        neuX = X
                                        neuY = Y
                                End Select
                                If OnMap(neuX, neuY) Then
                                    If Landschaften(neuX, neuY, Luftschlacht).getID = "LUFT" Then
                                        Hauptmenü.NetzBefehlSendenWolkenBewegen(X, Y, neuX, neuY)
                                        Dim LandschaftAlt As ObjektLandschaft = Landschaften(neuX, neuY, Luftschlacht)
                                        Landschaften(neuX, neuY, Luftschlacht) = Landschaften(X, Y, Luftschlacht)
                                        Landschaften(X, Y, Luftschlacht) = LandschaftAlt
                                        Dim Spieler As Integer = 0
                                        Do
                                            Spieler = Zufallszahl(1, Me.Spieler.Length - 1)
                                        Loop While Spieler = Landschaften(neuX, neuY, Luftschlacht).GetSpielerWolken
                                        Landschaften(neuX, neuY, Luftschlacht).SetSpielerWolken(Spieler)
                                        Landschaften(neuX, neuY, Luftschlacht).Bewegungsrichtung = Richtung
                                    Else
                                        Landschaften(X, Y, Luftschlacht).SetSpielerWolken(Zufallszahl(1, Spieler.Length - 1))
                                    End If
                                Else
                                    Landschaften(X, Y, Luftschlacht).SetSpielerWolken(Zufallszahl(1, Spieler.Length - 1))
                                End If
                            End If
                        End If
                    End If
                Next
            Next
        End If
    End Sub
    Public Sub WolkenBewegen(ByVal X As Integer, ByVal Y As Integer, ByVal neuX As Integer, ByVal neuY As Integer)
        Dim LandschaftAlt As ObjektLandschaft = Landschaften(neuX, neuY, Luftschlacht)
        Landschaften(neuX, neuY, Luftschlacht) = Landschaften(X, Y, Luftschlacht)
        Landschaften(X, Y, Luftschlacht) = LandschaftAlt
    End Sub
    Private Sub Anfangs3DIni()
        'Ein schönes Lichterspiel:
        If Regeln.Nebel = Nebelarten.Aus Or Not My.Settings.Kriegsnebel3D Then
            'Das standardlicht, was kaum rechenkraft verbraucht.
            Grafikengine.LichtartÄndern(False)
        Else
            Grafikengine.LichtartÄndern(True)
        End If
        Wetter3D = Partikelklasse.CreateWetter(Breite, Höhe, Regeln.Wetter)
        'Jetzt das Spielfeld richtig zentrieren.
        KameraTarget = New Vector3(Breite / 2, 0, -Höhe / 2)
    End Sub
#End Region

    Public Sub NächsteEinheit()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        Select Case M.Spielmodus
            Case ObjektSpielMenü.Spielmodi.Nichts
                Dim X As Integer = Hauptmenü.SpielfeldPunkt.X
                Dim Y As Integer = Hauptmenü.SpielfeldPunkt.Y
                Dim Start As Boolean = False
                If Y >= Höhe Or Y < 0 Then
                    Y = 0
                End If
                If X >= Breite Then
                    X = 0
                    If Y + 1 < Höhe Then
                        Y += 1
                    Else
                        Y = 0
                    End If
                ElseIf X < 0 Then
                    X = 0
                End If
                For Y1 = 0 To Höhe - 1
                    For X1 = 0 To Breite - 1
                        If Start = False Then
                            X1 = X + 1
                            Y1 = Y
                            If X1 + 1 >= Breite Then
                                X1 = 0
                                If Y1 + 1 >= Höhe Then
                                    Y1 = 0
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = 0 To Y
                    For X1 = 0 To Breite - 1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit For
                        End If
                    Next
                Next
                Start = False
                'Wir gehen die Baugebäude durch.
                For Y1 = 0 To Höhe - 1
                    For X1 = 0 To Breite - 1
                        If Start = False Then
                            X1 = X + 1
                            Y1 = Y
                            If X1 + 1 >= Breite Then
                                X1 = 0
                                If Y1 + 1 >= Höhe Then
                                    Y1 = 0
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebäude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetRealGebäudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = 0 To Y
                    For X1 = 0 To Breite - 1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebäude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetRealGebäudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit Sub
                        End If
                    Next
                Next
            Case ObjektSpielMenü.Spielmodi.Angriff
                NächstesMarkiertesFeld()
            Case ObjektSpielMenü.Spielmodi.Entladen
                NächstesMarkiertesFeld()
            Case ObjektSpielMenü.Spielmodi.GebäudeSchuss
                NächstesMarkiertesFeld()
            Case ObjektSpielMenü.Spielmodi.Reparieren
                NächstesMarkiertesFeld()
        End Select
    End Sub
    Public Sub LetzteEinheit()
        Dim M As ObjektSpielMenü = Objektverwalter.Menü
        Select Case M.Spielmodus
            Case ObjektSpielMenü.Spielmodi.Nichts
                Dim X As Integer = Hauptmenü.SpielfeldPunkt.X
                Dim Y As Integer = Hauptmenü.SpielfeldPunkt.Y
                Dim Start As Boolean = False
                If Y >= Höhe Or Y < 0 Then
                    Y = 0
                End If
                If X >= Breite Then
                    X = 0
                    Y += 1
                ElseIf X < 0 Then
                    X = 0
                End If
                For Y1 = Höhe - 1 To 0 Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If Start = False Then
                            X1 = X - 1
                            Y1 = Y
                            If X1 < 0 Then
                                X1 = 0
                                Y1 -= 1
                                If Y1 < 0 Then
                                    Y1 = Höhe - 1
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = Höhe - 1 To Y Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                            If Einheiten(X1, Y1, MomentaneSchlacht).Spieler = AktuellerSpieler.Spieler Then
                                If Einheiten(X1, Y1, MomentaneSchlacht).HatsichBewegt = False Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit For
                        End If
                    Next
                Next
                Start = False
                'Wir gehen die Baugebäude durch.
                For Y1 = Höhe - 1 To 0 Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If Start = False Then
                            X1 = X - 1
                            Y1 = Y
                            If X1 < 0 Then
                                X1 = 0
                                Y1 -= 1
                                If Y1 < 0 Then
                                    Y1 = Höhe - 1
                                End If
                            End If
                            Start = True
                        End If
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebäude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetRealGebäudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                    Next
                Next
                For Y1 = Höhe - 1 To Y Step -1
                    For X1 = Breite - 1 To 0 Step -1
                        If IsNothing(Einheiten(X1, Y1, MomentaneSchlacht)) = False Then
                        ElseIf IsNothing(Landschaften(X1, Y1, MomentaneSchlacht).Gebäude) = False Then
                            If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Spieler = AktuellerSpieler.Spieler Then
                                If Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetBaulisteThisPlayer.Length > 0 Or Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.Feuerbereit = 0 And Landschaften(X1, Y1, MomentaneSchlacht).Gebäude.GetRealGebäudeID <> "VERWEIS" Then
                                    Objektverwalter.ZuFeldgehen(X1, Y1)
                                    Hauptmenü.CursorPlazieren(X1 * Hauptmenü.Feldbreite, Y1 * Hauptmenü.Feldbreite)
                                    MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Feld Wechsel.wav", False)
                                    Exit Sub
                                End If
                            End If
                        End If
                        If X1 = X And Y1 = Y Then
                            Exit Sub
                        End If
                    Next
                Next
            Case ObjektSpielMenü.Spielmodi.Angriff
                NächstesMarkiertesFeld()
            Case ObjektSpielMenü.Spielmodi.Entladen
                NächstesMarkiertesFeld()
            Case ObjektSpielMenü.Spielmodi.GebäudeSchuss
                NächstesMarkiertesFeld()
            Case ObjektSpielMenü.Spielmodi.Reparieren
                NächstesMarkiertesFeld()
        End Select
    End Sub

    Private Sub NächstesMarkiertesFeld()
        For I = 0 To Objektverwalter.MarkierteFelder.Count - 1
            If Objektverwalter.MarkierteFelder(I).X = Hauptmenü.SpielfeldPunkt.X Then
                If Objektverwalter.MarkierteFelder(I).Y = Hauptmenü.SpielfeldPunkt.Y Then
                    If I + 1 >= Objektverwalter.MarkierteFelder.Count Then
                        I = 0
                    Else
                        I += 1
                    End If
                    Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(I).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(I).Y * Hauptmenü.Feldbreite)
                    Exit Sub
                End If
            End If
        Next
        Hauptmenü.CursorPlazieren(Objektverwalter.MarkierteFelder(0).X * Hauptmenü.Feldbreite, Objektverwalter.MarkierteFelder(0).Y * Hauptmenü.Feldbreite)
    End Sub
    ''' <summary>
    ''' Überprüft ob das Feld auf dem Spielfeld ist.
    ''' </summary>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function OnMap(ByVal X As Integer, ByVal Y As Integer) As Boolean
        If X >= 0 Then
            If Y >= 0 Then
                If X < Breite Then
                    If Y < Höhe Then
                        Return True
                    End If
                End If
            End If
        End If
        Return False
    End Function
    Public Function OnMap(ByVal P As Point) As Boolean
        Return OnMap(P.X, P.Y)
    End Function

    ''' <summary>
    ''' Plaziert eine Einheit auf das näheste Gelände von diesem Feld aus, welches Begehbar ist.
    ''' </summary>
    ''' <param name="Unit"></param>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Sub PlaceUnit(ByVal Unit As ObjektEinheit, ByVal X As Integer, ByVal Y As Integer, ByVal Schlachtfeld As Integer)
        If Unit.CanMoveOverTile(X, Y, Schlachtfeld) = True And Einheiten(X, Y, Schlachtfeld) Is Nothing Then
            Unit.X = X
            Unit.Y = Y
            Einheiten(X, Y, Schlachtfeld) = Unit
            Exit Sub
        End If
        Dim MomentanterRadius As Integer = 0
        Dim X2 As Integer = 0
        Dim Y2 As Integer = 0
        Dim Gefunden As Boolean = False
        Dim Modus As Integer = 0
        While Gefunden = False
            If Modus = 0 Then
                MomentanterRadius += 1
                X2 = MomentanterRadius
                Y2 = 0
            End If
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Unit.CanMoveOverTile(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing Then
                        Unit.X = X + X2 - MomentanterRadius
                        Unit.Y = Y + Y2 - MomentanterRadius
                        Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) = Unit
                        Exit Sub
                    End If
                End If
            Next

            If MomentanterRadius > Objektverwalter.Spielfeld.Breite And MomentanterRadius > Objektverwalter.Spielfeld.Höhe Then
                'wir finden kein Terrain.
                Exit While
            End If
        End While
    End Sub
    ''' <summary>
    ''' Plaziert ein kleines Gebäude auf das näheste Gelände von diesem Feld aus, welches Begehbar ist.
    ''' </summary>
    ''' <param name="Gebäude"></param>
    ''' <param name="X"></param>
    ''' <param name="Y"></param>
    ''' <remarks></remarks>
    Public Sub PlaceBuilding(ByVal Gebäude As ObjektGebäude, ByVal X As Integer, ByVal Y As Integer, ByVal Schlachtfeld As Integer)
        If Gebäude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).getID) = True And Einheiten(X, Y, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebäude Is Nothing Then
            Objektverwalter.Spielfeld.Landschaften(X, Y, Schlachtfeld).Gebäude = ObjektLadeklasse.NewGebäude(Gebäude.GebäudeID, Gebäude.Spieler, X, Y, Schlachtfeld, Objektverwalter.Spielfeld)
            Exit Sub
        End If
        Dim MomentanterRadius As Integer = 0
        Dim X2 As Integer = 0
        Dim Y2 As Integer = 0
        Dim Gefunden As Boolean = False
        Dim Modus As Integer = 0
        While Gefunden = False
            If Modus = 0 Then
                MomentanterRadius += 1
                X2 = MomentanterRadius
                Y2 = 0
            End If
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebäude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude = ObjektLadeklasse.NewGebäude(Gebäude.GebäudeID, Gebäude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 += 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebäude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude = ObjektLadeklasse.NewGebäude(Gebäude.GebäudeID, Gebäude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 -= 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebäude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude = ObjektLadeklasse.NewGebäude(Gebäude.GebäudeID, Gebäude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next
            For I = 1 To MomentanterRadius
                X2 += 1
                Y2 -= 1
                If OnMap(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius) = True Then
                    If Gebäude.GetLandschaftsuntergrund.Contains(Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).getID) = True And Einheiten(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld) Is Nothing And Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude Is Nothing Then
                        Objektverwalter.Spielfeld.Landschaften(X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld).Gebäude = ObjektLadeklasse.NewGebäude(Gebäude.GebäudeID, Gebäude.Spieler, X + X2 - MomentanterRadius, Y + Y2 - MomentanterRadius, Schlachtfeld, Objektverwalter.Spielfeld)
                        Exit Sub
                    End If
                End If
            Next

            If MomentanterRadius > Objektverwalter.Spielfeld.Breite And MomentanterRadius > Objektverwalter.Spielfeld.Höhe Then
                'wir finden kein Terrain.
                Exit While
            End If
        End While
    End Sub

    Public Sub SchlachtWechseln(Optional ByVal Senden As Boolean = True)
        If Objektverwalter.Spielfeld.AktuellerSpieler IsNot Nothing Then
            If Senden Then
                If Objektverwalter.Spielfeld.AktuellerSpieler.KIStufe <> ObjektSpieler.KIStufen.Passiv Then
                    Hauptmenü.NetzBefehlSendenSchlachtfeldWechsel(Objektverwalter.Spielfeld.AktuellerSpieler.Spieler)
                End If
            End If
        End If
        'Das müsste reichen um die Schlacht zu wechseln
        If Objektverwalter.Spielfeld.Regeln.Luftschlacht = True Then
            If Objektverwalter.Spielfeld.MomentaneSchlacht = ObjektSpielfeld.Bodenschlacht Then
                Objektverwalter.Spielfeld.MomentaneSchlacht = ObjektSpielfeld.Luftschlacht
            Else
                Objektverwalter.Spielfeld.MomentaneSchlacht = ObjektSpielfeld.Bodenschlacht
            End If

            'Wir erstellen die Sicht.
            Sichterstellen()
        End If
    End Sub
    Public Function GetSpielgröße() As Integer
        Return Breite * Höhe
    End Function
    Public Function GetCommanderWarsModus() As CommanderWarsGameModi
        Return CommanderWarsModus
    End Function

    Public Sub SetAutoResizeMapPosition()
        If My.Settings.AutoResizeWindow And My.Settings.Fenstermodus Then
            BildschirmKooX = 0
            BildschirmKooY = 0
        End If
    End Sub

    ''' <summary>
    ''' Klont ein Spielfeld ohne
    ''' Wegsuchsystem,
    ''' ObjektLaufen,
    ''' Aktueller Pfeil,
    ''' Animationen,
    ''' AngriffsAnzeige,
    ''' KOInfos,
    ''' Angriff,
    ''' AnimationsBackbuffer,
    ''' RundenAnfangAnzeige,
    ''' KOAnzeige,
    ''' InfoAnzeige,
    ''' ObjektLandkartenInfo,
    ''' Aufzeichnung
    ''' Scripts
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim S As ObjektSpielfeld = MyBase.MemberwiseClone
        S.KameraPos = New Vector3(KameraPos.X, KameraPos.Y, KameraPos.Y)
        S.AktuelleEinheit = Nothing
        S.AktuelleEinheitPosition = New Point(AktuelleEinheitPosition.X, AktuelleEinheitPosition.Y)
        S.Wegsuchsystem = Nothing
        S.Laufen = Nothing
        S.AktuelleEinheitPfeil = Nothing
        ReDim S.Animationen(-1)
        S.AngriffsAnzeige = Nothing
        S.Angriff = Nothing
        S.AnimationsBackbuffer = Nothing
        S.RundenAnfangAnzeige = Nothing
        S.ObjektLandkartenInfo = Nothing
        S.Aufzeichnung = Nothing
        S.Scripts = Nothing
        ReDim S.Landschaften(S.Breite - 1, S.Höhe - 1, 1)
        ReDim S.Einheiten(S.Breite - 1, S.Höhe - 1, 1)
        For I = 0 To 1
            For X = 0 To Breite - 1
                For Y = 0 To Höhe - 1
                    S.Landschaften(X, Y, I) = Landschaften(X, Y, I).Clone
                    If Einheiten(X, Y, I) IsNot Nothing Then
                        S.Einheiten(X, Y, I) = Einheiten(X, Y, I).Clone
                    End If
                Next
            Next
        Next
        ReDim S.Spieler(Spieler.Length - 1)
        For I = 0 To Spieler.Length - 1
            S.Spieler(I) = Spieler(I).Clone
            For I2 = 0 To S.Spieler(I).ExternGezogeneEinheiten.Length - 1
                S.Spieler(I).ExternGezogeneEinheiten(I2).Einheit = S.Einheiten(Spieler(I).ExternGezogeneEinheiten(I2).Einheit.X, Spieler(I).ExternGezogeneEinheiten(I2).Einheit.Y, Spieler(I).ExternGezogeneEinheiten(I2).Einheit.GetMap(Me))
            Next
        Next

        S.Regeln = Regeln.Clone
        S.KOInfos = Nothing
        S.KOAnzeigen = Nothing
        S.InfoAnzeige = Nothing
        'Neue KI erstellen
        If AktuellerSpieler IsNot Nothing Then
            S.AktuellerSpieler = S.Spieler(AktuellerSpieler.Spieler)
            S.KI = ObjektLadeklasse.NewKI(S.AktuellerSpieler)
        End If
        Return S
    End Function

    Public Function CalculateMinGebäudeFürSieg() As Integer
        Dim G(Spieler.Length - 2) As Integer
        For X = 0 To Breite - 1
            For Y = 0 To Höhe - 1
                Dim Gebäude As ObjektGebäude = Landschaften(X, Y, Bodenschlacht).Gebäude
                If Gebäude IsNot Nothing Then
                    If Not TypeOf Gebäude Is GebäudeVerweis Then
                        If Gebäude.Spieler > 0 Then
                            G(Gebäude.Spieler - 1) += 1
                        End If
                    End If
                End If
            Next
        Next
        Dim Max As Integer = G(0)
        For I = 0 To G.Length - 1
            If G(I) > Max Then
                Max = G(I)
            End If
        Next
        Return Max
    End Function
    ''' <summary>
    ''' Wie viele SChlachtfelder gibt es? 0 oder 1.
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function GetSchlachtenZahl() As Integer
        If Regeln IsNot Nothing Then
            If Regeln.Luftschlacht Then
                Return 1
            Else
                Return 0
            End If
        Else
            Return 1
        End If
    End Function
    ''' <summary>
    ''' Wie viele Gebäude gibt es insgesamt?
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function CountBuildings() As Integer
        Dim G As Integer = 0
        For Each L In Landschaften
            If L.Gebäude IsNot Nothing Then
                If L.Gebäude.getFonds Then
                    G += 1
                End If
            End If
        Next
        Return G
    End Function
#Region "3D"
    <NonSerialized()> Dim Wetter3D As Partikelklasse
    Sub WetterMalen3D(ByVal Wetter As Wetterarten)
        If Wetter3D IsNot Nothing Then
            Grafikengine.Grafikkarte.RenderState.ZBufferEnable = False
            If Wetter3D.Wetter <> Wetter Then
                Wetter3D = Partikelklasse.CreateWetter(Breite, Höhe, Wetter)
            End If
            Wetter3D.Berechnen()
            Wetter3D.Malen()
            Grafikengine.Grafikkarte.RenderState.ZBufferEnable = True
        End If
    End Sub
#End Region
End Class